#include<bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
const int MAXN = 4005;

int n;
int a[MAXN]; // 每个魔法师的ai值
int total_blue[MAXN]; // 前i个魔法师总共有多少个蓝水晶
int total_red[MAXN];  // 前i个魔法师总共有多少个红水晶
long long dp[MAXN][MAXN]; // dp[i][j]表示收集了i个蓝水晶和j个红水晶的方案数

int main() {
    cin >> n;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        // 计算前i个魔法师的总蓝水晶和总红水晶数量
        total_blue[i] = total_blue[i-1] + (a[i] == 1 ? 1 : (a[i] == 2 ? 2 : 0));
        total_red[i] = total_red[i-1] + (a[i] == 1 ? 1 : (a[i] == 0 ? 2 : 0));
    }
    
    dp[0][0] = 1; // 初始状态，0个蓝水晶和0个红水晶
    
    for(int i = 0; i <= total_blue[n]; i++) {
        for(int j = 0; j <= total_red[n]; j++) {
            if(i == 0 && j == 0) continue; // 已经初始化过了
            
            int k = i + j; // 已经进行了k轮操作
            // 如果k超过了2n，不可能的情况
            if(k > 2 * n) {
                dp[i][j] = 0;
                continue;
            }
            
            // 确定当前处理到第几个魔法师
            // 在k轮操作后，前min(k, n)个魔法师已经交出了他们的水晶
            int m = min(k, n);
            
            // 检查当前的红蓝水晶数量是否合法
            // 即不能超过前m个魔法师拥有的总红蓝水晶数量
            if(i > total_blue[m] || j > total_red[m]) {
                dp[i][j] = 0;
                continue;
            }
            
            // 状态转移：可以从上一个状态加蓝水晶或红水晶转移而来
            dp[i][j] = 0;
            if(i > 0) {
                dp[i][j] = (dp[i][j] + dp[i-1][j]) % MOD;
            }
            if(j > 0) {
                dp[i][j] = (dp[i][j] + dp[i][j-1]) % MOD;
            }
        }
    }
    
    cout << dp[total_blue[n]][total_red[n]] << endl;
    return 0;
}